<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <title>Test for sub workers+bfcache behavior</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
  <script type="application/javascript">

  const WORKER_URL = "worker_suspended.js";
  const SUB_WORKERS = 3

  var testUrl1 = "window_suspended.html?page1Shown";
  var testUrl2 = "window_suspended.html?page2Shown";

  var testWin;
  var counter = 0;

  function cacheData() {
    return caches.open("test")
           .then(function(cache) {
             return cache.match("http://mochi.test:888/foo");
           })
           .then(function(response) {
             return response.text();
           });
  }

  function page1Shown(e) {
    info("Page1Shown: " + testWin.location.href);

    // First time this page is shown.
    if (counter == 0) {
      ok(!e.persisted, "test page should have been persisted initially");

      info("Create a worker and subworkers...");
      let worker = new e.target.defaultView.Worker(WORKER_URL);

      var promise = new Promise((resolve, reject) => {
        info("Waiting until workers are ready...");
        worker.addEventListener("message", function onmessage(e) {
          is(e.data, "ready", "We want to receive: -ready-");
          worker.removeEventListener("message", onmessage);
          resolve();
        });
        worker.postMessage({ type: "page1", count: SUB_WORKERS });
      });

      promise.then(function() {
        info("Retrieving data from cache...");
        return cacheData();
      })

      .then(function(content) {
        is(content.indexOf("page1-"), 0, "We have data from the worker");
      })

      .then(function() {
        info("New location: " + testUrl2);
        testWin.location.href = testUrl2;
      });
    } else {
      is(e.persisted, true, "test page should have been persisted in pageshow");

      var promise = new Promise((resolve, reject) => {
        info("Waiting a few seconds...");
        setTimeout(resolve, 5000);
      });

      promise.then(function() {
        info("Retrieving data from cache...");
        return cacheData();
      })

      .then(function(content) {
        is(content.indexOf("page1-"), 0, "We have data from the worker");
      })

      .then(function() {
        testWin.close();
        SimpleTest.finish();
      });
    }

    counter++;
  }

  function page2Shown(e) {
    info("Page2Shown: " + testWin.location.href);

    info("Create a worker...");
    let worker = new e.target.defaultView.Worker(WORKER_URL);

    var promise = new Promise((resolve, reject) => {
      info("Waiting until workers are ready...");
      worker.addEventListener("message", function onmessage(e) {
        is(e.data, "ready", "We want to receive: -ready-");
        worker.removeEventListener("message", onmessage);
        resolve();
      });
      worker.postMessage({ type: "page2" });
    });

    promise.then(function() {
      info("Retrieving data from cache...");
      return cacheData();
    })

    .then(function(content) {
      is(content, "page2-0", "We have data from the second worker");
    })

    .then(function() {
      info("Going back");
      testWin.history.back();
    });
  }

  SpecialPowers.pushPrefEnv({ set: [
    ["dom.caches.enabled", true],
    ["dom.caches.testing.enabled", true],
  ] },
  function() {
    testWin = window.open(testUrl1);
  });

  SimpleTest.waitForExplicitFinish();
  SimpleTest.requestFlakyTimeout("untriaged");

  </script>
</body>
</html>

